package cl.gob.minvu.catastromobile;

import java.util.Arrays;
import java.util.Date;
import java.util.List;

import com.google.gson.Gson;

import cl.gob.minvu.catastromobile.dao.FichaDAO;
import cl.gob.minvu.catastromobile.dao.UsuarioDAO;
import cl.gob.minvu.catastromobile.entities.Diagnostico;
import cl.gob.minvu.catastromobile.entities.Direccion;
import cl.gob.minvu.catastromobile.entities.Encuestado;
import cl.gob.minvu.catastromobile.entities.EvaluacionDanios;
import cl.gob.minvu.catastromobile.entities.Ficha;
import cl.gob.minvu.catastromobile.entities.GrupoPrincipal;
import cl.gob.minvu.catastromobile.entities.GrupoSecundario;
import cl.gob.minvu.catastromobile.entities.SituacionVivienda;
import cl.gob.minvu.catastromobile.to.FichaTO;
import cl.gob.minvu.catastromobile.util.GenericUtil;
import android.content.SharedPreferences.Editor;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.AdapterView;
import android.widget.Spinner;
import android.widget.AdapterView.OnItemSelectedListener;

/**
 * @author psep
 * 
 */
public class FormActivity extends AbstractActivity {

	private Spinner tipoCatastrofe;
	private Spinner moradores;
	private Ficha ficha;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_form);
		super.session = super.getSharedPreferences(GenericUtil.SESSION,
				MODE_PRIVATE);
		this.tipoCatastrofe = (Spinner) super
				.findViewById(R.id.spinnerTipoCatastrofe);
		this.moradores = (Spinner) super.findViewById(R.id.spinnerMoradores);

		this.moradores.setOnItemSelectedListener(new OnItemSelectedListener() {
			public void onItemSelected(AdapterView<?> parent, View view,
					int position, long id) {
				if (position == 2) {
					Gson gson = new Gson();
					String serializable = gson.toJson(new GrupoPrincipal());
					Editor edit = session.edit();
					edit.remove(GenericUtil.ENCUESTADO);
					edit.remove(GenericUtil.GRUPO_PRINCIPAL);
					edit.putString(GenericUtil.GRUPO_PRINCIPAL, serializable);
					edit.commit();
				}
			}

			public void onNothingSelected(AdapterView<?> parent) {
			}
		});

		this.onLoadSession();
	}

	/**
	 * 
	 */
	private void onLoadSession() {
		String fichaJson = super.session.getString(GenericUtil.FICHA, null);

		if (fichaJson != null) {
			Gson gson = new Gson();
			this.ficha = gson.fromJson(fichaJson, Ficha.class);
			this.loadFrm();
		}
	}

	/**
	 * 
	 */
	private void loadFrm() {
		if (this.ficha != null) {
			this.tipoCatastrofe.setSelection(this.ficha.tipoCatastro);
			this.moradores.setSelection(this.ficha.moradores);
		}
	}

	/**
	 * 
	 */
	private void loadFicha() {
		this.ficha = new Ficha();
		this.ficha.fechaVisita = GenericUtil.dateToString(new Date());
		this.ficha.moradores = this.moradores.getSelectedItemPosition();
		this.ficha.tipoCatastro = this.tipoCatastrofe.getSelectedItemPosition();
	}

	@Override
	public boolean onCreateOptionsMenu(Menu menu) {
		getMenuInflater().inflate(R.menu.form, menu);
		return true;
	}

	@Override
	public boolean onOptionsItemSelected(MenuItem item) {
		int id = item.getItemId();

		if (id == R.id.ficha_frm_descarta) {
			this.reset();
			return true;
		}

		return super.onOptionsItemSelected(item);
	}

	/**
	 * @param button
	 */
	public void onClickEnviar(View button) {
		if (this.validateFrm()) {

			Ficha fichaFinal = this.ficha;
			Encuestado encuestado = (Encuestado) GenericUtil.jsonToObject(
					session, GenericUtil.ENCUESTADO, Encuestado.class);
			Direccion direccion = (Direccion) GenericUtil.jsonToObject(session,
					GenericUtil.DIRECCION, Direccion.class);
			GrupoPrincipal grupoPrincipal = (GrupoPrincipal) GenericUtil
					.jsonToObject(session, GenericUtil.GRUPO_PRINCIPAL,
							GrupoPrincipal.class);
			String observaciones = super.session.getString(
					GenericUtil.OBSERVACIONES, null);

			GrupoSecundario[] listArray = (GrupoSecundario[]) GenericUtil
					.jsonToObject(session, GenericUtil.LIST_SECUNDARIO,
							GrupoSecundario[].class);

			List<GrupoSecundario> listSecundarios = null;

			if (listArray != null && listArray.length > 0) {
				listSecundarios = Arrays.asList(listArray);
			}

			SituacionVivienda situacion = (SituacionVivienda) GenericUtil
					.jsonToObject(session, GenericUtil.SITUACION,
							SituacionVivienda.class);
			EvaluacionDanios evaluacion = (EvaluacionDanios) GenericUtil
					.jsonToObject(session, GenericUtil.EVALUACION,
							EvaluacionDanios.class);
			String photo1 = session.getString(GenericUtil.PHOTO_1, null);
			Diagnostico diagnostico = (Diagnostico) GenericUtil.jsonToObject(
					session, GenericUtil.DIAGNOSTICO, Diagnostico.class);

			if (direccion != null && diagnostico != null && situacion != null
					&& evaluacion != null) {
				if (this.moradores.getSelectedItemPosition() == 1
						&& encuestado == null) {
					super.toastMsg("Debe completar datos del encuestado");
				} else {
					fichaFinal.diagnostico = diagnostico;
					fichaFinal.direccion = direccion;
					fichaFinal.situacionVivienda = situacion;
					fichaFinal.evaluacion = evaluacion;
					fichaFinal.encuestado = encuestado;
					fichaFinal.mainGroup = grupoPrincipal;
					fichaFinal.observaciones = observaciones;
					fichaFinal.listGrupoSecundario = listSecundarios;
					fichaFinal.user = new UsuarioDAO(this).retrieve();

					String serializado = new Gson().toJson(fichaFinal);

					FichaTO fichaTO = new FichaTO();
					fichaTO.setFicha(serializado);
					String glosa = "";
					
					if (encuestado != null) {
						glosa = fichaFinal.encuestado.nombres
								+ " " + fichaFinal.encuestado.apellidoPaterno + "\n";
					}
					
					glosa += fichaFinal.direccion.calle
							+ " " + fichaFinal.direccion.numeracion;
					
					fichaTO.setNombreJefeHogar(glosa);
					fichaTO.setPhoto1(photo1);

					new FichaDAO(this).insert(fichaTO);
					this.reset();
					super.go(OptionsActivity.class);
					finish();
				}
			} else {
				super.toastMsg("Debe completar el formulario");
			}
		}
	}

	/**
	 * 
	 */
	private void saveObject() {
		this.loadFicha();

		Gson gson = new Gson();
		String serializable = gson.toJson(this.ficha);
		Editor edit = super.session.edit();
		edit.putString(GenericUtil.FICHA, serializable);
		edit.commit();
	}

	/**
	 * @param button
	 */
	public void onClickAntecedentes(View button) {
		int idMoradores = this.moradores.getSelectedItemPosition();

		if (idMoradores == 1) {
			this.saveObject();
			super.go(AntViviendaEncActivity.class);
		} else if (idMoradores == 2) {
			this.saveObject();
			super.go(AntViviendaEncDirActivity.class);
		} else {
			super.toastMsg("Debe seleccionar CON o SIN Moradores");
		}
	}

	/**
	 * @param button
	 */
	public void onClickDatosFamiliares(View button) {
		this.saveObject();
		super.go(ListGrupoSecundarioActivity.class);
	}

	/**
	 * @param button
	 */
	public void onClickDiagnostico(View button) {
		this.saveObject();
		super.go(DiagnosticoActivity.class);
	}

	/**
	 * @param button
	 */
	public void onClickEvaluacion(View button) {
		this.saveObject();
		super.go(SituacionActivity.class);
	}

	/**
	 * @param button
	 */
	public void onClickObservaciones(View button) {
		this.saveObject();
		super.go(ObservacionActivity.class);
	}

	/**
	 * @param button
	 */
	public void onClickFoto(View button) {
		this.saveObject();
		super.go(PhotoActivity.class);
	}

	@Override
	public void reset() {
		Editor edit = super.session.edit();
		edit.clear();
		edit.commit();
		this.tipoCatastrofe.setSelection(0);
		this.moradores.setSelection(0);
	}

	@Override
	public boolean validateFrm() {
		int idMoradores = this.moradores.getSelectedItemPosition();
		int idCatastrofe = this.tipoCatastrofe.getSelectedItemPosition();

		if (idMoradores == 0) {
			super.toastMsg("Debe seleccionar CON o SIN Moradores");
			return false;
		}
		
		if (idCatastrofe == 0) {
			super.toastMsg("Debe seleccionar el tipo de catastrofe");
			return false;
		}

		return true;
	}

}
